#include <iostream>
#include <pthread.h>
#include <queue>

using namespace std;

using callback = void (*)(void * arg);
//任务结构体
struct Task
{
    Task()
    {
        function = nullptr;
        arg = nullptr;
    }
    //有参构造
    Task(callback func, void* arg)
    {
        function = func;
        this->arg = arg;
    }
    callback function; //函数指针
    void* arg;
};
//任务队列
class TaskQue
{
private:
    queue<Task> mTaskQ;
    pthread_mutex_t mutexQue; //队列线程锁

public:
    TaskQue();
    ~TaskQue();
    inline int getmTaskQNum() //获取队列中任务个数
    {
        return mTaskQ.size();
    }
    void addTask(Task& task); //添加任务
    void addTask(callback func, void* arg); //添加任务
    Task execTask(); //执行任务 并从队列中删除任务
};

//线程池类
class CppThreadPool
{
private:
    TaskQue* mQue;

    int mMinNum;     //最小线程数
    int mMaxNum;     //最大线程数
    int mLiveNum;    //存活线程数
    int mBusyNum;    //忙线程数
    int mExitNum;    //要销毁线程数
    bool mShutDown; //是否要销毁线程 true 销毁 false 不销毁

    pthread_mutex_t mMutexPool; // 为线程池加锁
    pthread_cond_t mEmpty; //条件变量 判空

    pthread_t mManagerID;
    pthread_t* mThreadIDs;

    const static int COUNTER = 2;

public:
    CppThreadPool(int min, int max);
    ~CppThreadPool();

    void addTaskToPool(Task task); //添加任务
    int getLiveNum();//获取工作的线程个数
    int getBusyNum();//获取工作的busy的线程个数

private:
    static void* manager(void* arg);
    static void* worker(void* arg);
    void threadExit();
};

